﻿using Microsoft.AspNetCore.Mvc;
using MVCDemo.Models.Database;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace MVCDemo.Controllers
{
    //[Route("[controlle]/[action]")]
   [Route("/api/[controller]/[action]")]
    public class TestController : Controller
    {
        private readonly Store_2022Context _db;
        public TestController(Store_2022Context db)
        {
            _db = db;
        }
        public IActionResult AddTEST()
        {
            //1、new一个分类对象 
            var cate = new Category()
            {
                CateName = "手机"
            };

            //2、添加数据
            _db.Categories.Add(cate);

            //3、保存 执行SQL
            var row = _db.SaveChanges();
            return Content("添加数据");
        }
        public IActionResult AddRange()
        {
            //new一个对象列表
            var list = new List<Category>();
            list.Add(new Category
            {
                CateName = "家具"
            });
            list.Add(new Category
            {
                CateName = "家电"
            });
            list.Add(new Category
            {
                CateName = "图书"
            });
            //添加数据
            _db.Categories.AddRange(list);

            //保存 执行SQL
            var row = _db.SaveChanges();

            //如果影响行数>0
            if (row > 0)
                return Content("添加成功");
            return Content("添加失败");
        }
        public IActionResult AddGoods()
        {
            var good = new Good()
            {
                Name = "华为P60",
                CateId=1,
                CreateTime=DateTime.Now,
                //图片在数据库是使用链接的方式保持的
                Cover="http://a.com/img.jpg",
                Price=1,
                Stock=10,
                UpdateTime=DateTime.Now
            };

            //2、添加数据
            _db.Goods.Add(good);

            //3、保存 执行SQL
            var row = _db.SaveChanges();
            return Content("添加数据");
        }
        public IActionResult Index()
        {
            return View();
        }
        public IActionResult GetList()
        {
            var list = _db.Categories.ToList();
            var list1 = _db.Categories.Where(x => x.Id == 1).ToList();
            var mode1 = _db.Categories.FirstOrDefault();
            var model1 = _db.Categories.Where(x => x.Id == 1).FirstOrDefault();//取第一条数据 如果没有 将会返回默认值 null
            //等同于       简化                             基于条件
            var model2 = _db.Categories.FirstOrDefault(x => x.Id == 1);//取第一条数据 如果没有 将会返回默认值 null

            //返回一个对象结果
            return new ObjectResult(list);
        }
        public IActionResult GetGoods()
        {
            var list=_db.Goods.Where(x => x.CateId == 1).ToList();
            return new ObjectResult(list);
        }
        //单个更新
        public IActionResult Update()
        {
            //查询Id为1的数据
            var model = _db.Categories.FirstOrDefault(x => x.Id == 1);

            //如果没有数据 返回提示
            if (model == null)
            {
                return Content("数据不存在");
            }

            //赋值
            model.CateName = "手机111";

            //更新
            _db.Categories.Update(model);

            //保存 执行SQL
            var row = _db.SaveChanges();

            //如果影响行数>0
            if (row > 0)
                return Content("添加成功");
            return Content("添加失败");
        }
        //多个更新
        public IActionResult UpdateRange()
        {
            var list = _db.Categories.ToList();

            foreach (var item in list)
            {
                item.CateName = item.CateName + "（更新）";
            }

            //更新
            _db.Categories.UpdateRange(list);

            //保存 执行SQL
            var row = _db.SaveChanges();

            //如果影响行数>0
            if (row > 0)
                return Content("添加成功");
            return Content("添加失败");
        }

        public IActionResult UpdateGoods()
        {
            var mode1 = _db.Goods.FirstOrDefault(x => x.Id == 50);
            if (mode1 == null)
                return Content("数据不存在");
            mode1.CateId = 2;
            _db.Goods.Update(mode1);
            var row = _db.SaveChanges();
            if (row > 0)
                return Content("成功");
            return Content("失败");
        }
        public IActionResult Remove()
        {
            //查询Id为1的数据
            var model = _db.Categories.FirstOrDefault(x => x.Id == 1);

            //如果没有数据 返回提示
            if (model == null)
            {
                return Content("数据不存在");
            }

            //删除
            _db.Categories.Remove(model);

            //保存 执行SQL
            var row = _db.SaveChanges();

            //如果影响行数>0
            if (row > 0)
                return Content("删除成功");
            return Content("删除失败");
        }
        public IActionResult DeleteGoods()
        {
            var mode2 = _db.Goods.FirstOrDefault(x => x.CateId == 1);
            if (mode2 == null)
            {
                return Content("数据不存在");
            }
            _db.Goods.Remove(mode2);
            var row = _db.SaveChanges();

            //如果影响行数>0
            if (row > 0)
                return Content("删除成功");
            return Content("删除失败");
        }
        public IActionResult OrderBy()
        {
            //select * from category order by id      正序
            //查询列表
            var list = _db.Categories.ToList();
            //                          排序(lamda表达式 指定一个字段)
            var list1 = _db.Categories.OrderBy(x => x.Id).ToList();
            var list2 = _db.Categories.OrderBy(x => x.CateName).ToList();
            //                                  判断结果  成立则返回数据
            var list3 = _db.Categories.Where(x => x.Id > 0).Where(x => x.CateName == "家具").ToList();
            //链式调用
            var list4 = _db.Categories
                .Where(x => x.Id > 0)
                .Where(x => x.CateName == "家具")
                .OrderBy(x => x.Id)
                .ToList();
            //select * from category order by id DESC 倒序
            //OrderByDescending()倒序查询 指定一个字段
            var list5 = _db.Categories.OrderByDescending(x => x.Id).ToList();

            //混合排序                   分类名称排序  当他两条数据分类名称相等时  谁排前面
            var list6 = _db.Categories.OrderBy(x => x.CateName).ToList();
            //增加第二排序条件ThenBy() ThenByDescending()
            var list7 = _db.Categories.OrderBy(x => x.CateName).ThenBy(x => x.Id).ToList();
            var list8 = _db.Categories.OrderBy(x => x.CateName).ThenByDescending(x => x.Id).ToList();
            //第三排序条件 
            var list9 = _db.Categories.OrderBy(x => x.CateName).ThenBy(x => x.Id).ThenByDescending(x => x.Id).ToList();
            return new ObjectResult(list);
        }
        //练习
        //在Test控制器添加SoftGoods方法，查询商品数据 并以 分类Id 倒序显示
        public IActionResult SoftGoods()
        {
            var list = _db.Goods.OrderByDescending(x => x.Id).ToList();
            //加一个 当分类的ID一样时。按商品的价格从小到大排序
            var list2 = _db.Goods.OrderByDescending(x => x.Id).ThenBy(x=>x.Price).ToList();
            return new ObjectResult(list);
        }
        public IActionResult SkipAndTake()
        {
            //需求 比如ID126~133一共八个数据 去后面五个数据129~133分类
            var list = _db.Categories.ToList();
            //跳过前N个数据方法Skip（）去后面五个数据 跳过几个
            var liat2 = _db.Categories.OrderBy(x => x.Id).Skip(3).ToList();
            //取前N个数据方法  126~130 前五个 Tack（）
            var liat3 = _db.Categories.OrderBy(x => x.Id).Take(5).ToList();
            //取第3-5个 跳过2个
             var liat4 = _db.Categories.OrderBy(x => x.Id).Skip(2).Take(3).ToList();
            //取第7-8 
            var liat5 = _db.Categories.OrderBy(x => x.Id).Skip(6).Take(2).ToList();
            return new ObjectResult(list);

            //分页 两条数据一页
            //126
            //127

            //128
            //129

            //130
            //131

            //132
            //133
            //取第二页 两条数据一页
            var list5 = _db.Categories.OrderBy(x => x.Id).Skip(2).Take(2).ToList();

            //取第三页 三条数据一页
            //126
            //127
            //128

            //129
            //130
            //131

            //132
            //133
            var list6 = _db.Categories.OrderBy(x => x.Id).Skip(6).Take(3).ToList();
            //页大小 一页多少条数据
            int pageSize = 5;
            int pageIndex = 2;//第几页 页码
            //                                  页码 pageIndex == 1 跳过多少  0个
            //                                  页码 pageIndex == 2 跳过多少  3个
            //                                  页码 pageIndex == 3 跳过多少  6个
            //分页实现原理
            var list7 = _db.Categories.OrderBy(x => x.Id)
                .Skip((pageIndex - 1) * pageSize)
                .Take(pageSize)
                .ToList();
            return new ObjectResult(list);
        }
        //在Test控制器添加SkipGoods方法，查询以商品价格倒序的3-7个商品
        public IActionResult SkipGoods()
        {
            var list = _db.Goods.OrderByDescending(x => x.Price).Skip(2).Take(5).ToList();
            return new ObjectResult(list);
        }
        public IActionResult Any()
        {
            //整个分类表的列表 判断有无数据
            //结果  true 有数据    /  false 无数据
            var result = _db.Categories.Any();
            //                           根据条件 判断有无数据
            var result1 = _db.Categories.Where(x => x.Id > 100).Any();
            //  简化  等同于
            var result2 = _db.Categories.Any(x => x.Id > 100);
            return new ObjectResult(result);
        }

        //练习
        //在Test控制器添加AnyGoods方法，判断 商品金额 为100 的 商品 是否存在
        public IActionResult AnyGoods()
        {
            
            var result = _db.Goods.Any(x => x.Price==100);
            return new ObjectResult(result);
        }
        public IActionResult Count()
        {
            //返回列表的总数 返回分类的总数
            var count = _db.Categories.Count();
            //返回某个条件列表总数
            var count1 = _db.Categories.Where(x => x.Id > 100).Count();
            //简化 等同于
            var count2 = _db.Categories.Count(x => x.Id > 100);
            return new ObjectResult(count);
        }
        public IActionResult Sum()
        {
            //           求这个列表 商品的总金额
            var sum = _db.Goods.Sum(x=>x.Price);
            //    求分类Id==1的商品 总金额
            var sum1 = _db.Goods.Where(x => x.CateId == 1).Sum(x => x.Price);
            var sum2 = _db.Goods.Where(x => x.CateId == 2).Sum(x => x.Price);
            //平均数
            //求列表 商品金额平均数  sum/数量
            var avg = sum / _db.Goods.Count();
            //简化 
            var avg1 = _db.Goods.Average(x => x.Price);
            return new ObjectResult(sum);
        }
        //练习
        //在Test控制器添加CountGoods方法，查询 商品金额 为 500-1000 的 商品 数量
        
        public IActionResult CountGoods()
        {
            //逻辑运算符 与 或 非
            //          && || !
            var count = _db.Goods.Count(x => x.Price>=500&&x.Price<=1000);
            return new ObjectResult(count);
        }
        //在Test控制器添加SumGoods方法，查询 分类Id 为“1” 的 商品 总额
        public IActionResult SumGoods()
        {
            var sum = _db.Goods.Where(x=>x.Id == 1).Sum(x => x.Price);
            return new ObjectResult(sum);
        }
        //分组查询
        public IActionResult GroupBy()
        {
            //需要知道 商品表 每个分类Id的 的 商品总金额

            //GroupBy分组查询 指定字段分组CateId
            var list = _db.Goods.GroupBy(x => x.CateId)
                //构造一个新的列表
                .Select(x => new  //匿名对象
                {
                    //key是分组的值 CateId
                    x.Key,//CateId
                    //求和
                    Sum = x.Sum(z => z.Price),
                    //
                    Count = x.Count(),
                    //
                    Avg = x.Average(z => z.Price)
                }).ToList();
            return new ObjectResult(list);
        }

        //练习
        //在Test控制器添加StockGoods方法，统计 商品表 每个分类的 总库存 Stock
        public IActionResult StockGoods()
        {
            var list = _db.Goods.GroupBy(x => x.CateId)
                .Select(x => new
                {
                    x.Key,
                    Stock = x.Sum(z => z.Stock),
                }).ToList();
            return new ObjectResult(list);
        }
        public IActionResult Join()
        {
            //--inner join sql
            //                       4
            //select Goods.Id,Goods.Name,Category.CateName from Goods
            //                1                2          3
            //    inner join Category on Goods.CateId = Category.Id
            //连接的目的 从两个表获取字段
            //Join 4个参数  1、需要连接的表 2、连接的外键字段   3、主键字段
            var list = _db.Goods.Join(_db.Categories, x => x.CateId, y => y.Id,
                    //4、构造一个新的列表 从主表 和 连接表获取字段
                    (x, y) => new
                    {
                        x.Id,
                        x.Name,
                        y.CateName
                    }).ToList();
            return new ObjectResult(list);
        }

        //练习
        //在Join控制器添加JoinGoods方法名，实现查询商品表 分类名称为 “数码” 的 商品 数据
        public IActionResult JoinGoods()
        {
            var list = _db.Goods.Join(_db.Categories, x => x.CateId, y => y.Id, (x, y) => new
            {
                x.Id,
                x.Name,
                y.CateName
            }).Where(a => a.CateName == "数码").ToList();
            return new ObjectResult(list);
        }
    }
}
